package HereClass;

import Exceptions.IPException;
import Exceptions.LoginException;
import Exceptions.UsuarioException;
import Facade.FachadaDeArmazenamento;

/**
 * Contra os usuarios logados no I'mHere
 * @author Caio, Ronaldo, Enio e Rafael
 * @version 5.1
 */

public class ControleLogin {

	private UsuariosConectados usuariosConectados;
	private FachadaDeArmazenamento fachadaDeArmazenamento;

	/**
	 * Construtor vazio da classe ControleLogin
	 * Este construtor inicializa a capacidade do sistema e o array de usuarios conectados
	 */
	public ControleLogin() {
		this.usuariosConectados = UsuariosConectados.getInstance();
		this.fachadaDeArmazenamento = FachadaDeArmazenamento.getInstance();
	}

	/**Este metodo cria a conta de um usuario e o autentica
	 * @param userName
	 * @param nome
	 * @param email
	 * @param senha
	 * @param telefone
	 * @param IP
	 * @return retorna o id do usuario ao se conectar
	 * @throws Exception lanca excecoes se algum dos parametros eh invalido
	 */
	public int cadastrarUsuario(String userName, String nome, String email,
			String senha, String telefone, String IP) throws Exception {

		ManutencaoDeConta.getInstance().
					criarUsuario(userName, nome, email, senha, telefone);
		int id = login(userName, senha, IP);
		return id;
	}

	/**
	 * Este metodo efetua o login de um usuario
	 * @param userName
	 * @param senha
	 * @param IP
	 * @return retorna o id do usuario ao se conectar
	 * @throws Exception lanca excecoes se o IP fornecido for invalido ou se o userName e a senha nao conferem
	 */
	public int login(String userName, String senha, String IP)
								throws LoginException, IPException {
		checaIP(IP);
		Usuario user = (Usuario)fachadaDeArmazenamento.pesquisaUsuario(userName, 1);
		
		if (user == null || !user.getSenha().equals(senha))
			throw new LoginException("Login/senha invalidos.");
		
		
		int id = usuariosConectados.getIdUsuario(userName);
		if (id!=-1) {
			return id;
		}
		int idLogin = usuariosConectados.conectaUsuario(user);
		return idLogin;

	}

	private void checaIP(String IP) throws IPException {
		char[] aux = IP.toCharArray();
		int contaPontos = 0;
		
		for (int x = 0; x< aux.length; x++){
			if (aux[x] == '.') contaPontos++;
			if ((int)aux[x] > 65 && (int)aux[x] < 126){
				throw new IPException("IP invalido.");
			}
		}
		if (contaPontos != 3){
			throw new IPException("IP invalido.");
		}
		
	}


	/**
	 * Este metodo verifica se o usuaro esta conectado
	 * @param id
	 * @return retorna true se o usuario estiver conectado, caso contrario retorna false 
	 */
	public boolean estaConectado(String id) {
		int id1 = TransformaString.toInt(id);
		if(id1 == -1)
			return false;
		if (usuariosConectados.getUsuario(id) == null)
			return false;
		return true;
	}

	/**
	 * Este metodo desconecta o usuario
	 * @param id
	 * @throws Exception lanca excecoes caso o usuario nao esteja conectado
	 */
	public void logout(String id) throws UsuarioException {
		int id1 = TransformaString.toInt(id);
		if(id1 == -1)
			throw new UsuarioException("Sessao inexistente.");
		if (estaConectado(id)) {
			Conectavel user = usuariosConectados.getUsuario(id);
			usuariosConectados.desconectaUsuario(id1);
			fachadaDeArmazenamento.atualizaBancoDeDados(user);
			return;
		}
		throw new UsuarioException("Sessao inexistente.");
	}
	
	

}
